//////////////////////////////////////////////////////////////

//SOURCE FILE: scheduling_disco.c

//PROCESO PLANIFICADOR DE DISCO

//Autor: Pablo Bergna

//////////////////////////////////////////////////////////////

//shared library
#include "includes/todo_incluido.h"

//locales
#include "../includes/scheduling_disco.h"

typedef struct params_sstf{
	td_disco* disco;
}__attribute__((packed)) params_sstf;

typedef struct params_escuchar_ped{
	td_disco* disco;
}__attribute__((packed)) params_escuchar_ped;


void* escuchar_pedidos(void* arg){

	params_escuchar_ped* parametros = (params_escuchar_ped*)arg;

	printf("Hola soy el thread que escucha nuevos procesos\n");
	uint16_t iSock, new_sock_cli;
	uint8_t resultado;
	struct sockaddr_in addr;

	addr.sin_addr.s_addr=INADDR_ANY;
	addr.sin_family = AF_INET;
	addr.sin_port=0;

	bzero ( &(addr.sin_zero), 8);

	iSock = socket ( AF_INET, SOCK_STREAM, 0);
	if (iSock == -1) printf("ERROR AL CREAR SOCKET");

	resultado = bind(iSock, (struct sockaddr*) &addr, sizeof(addr));
	if (resultado == -1) {
		printf("ERROR AL UNIR EL SOCKET");
		exit(1);
		}

	char *some_addr;
	some_addr = inet_ntoa (addr.sin_addr);
	printf(" Direccion IP del socket de escucha es %d ", iSock);
	printf("es: %s ", some_addr);
	printf("y numero de puerto: %d\n", ntohs(addr.sin_port));

	while(1){

	listen(iSock, BACKLOG);
	socklen_t addrlen = sizeof (struct sockaddr_in);

	new_sock_cli = accept ( iSock, (struct sockaddr *)&addr, &addrlen);
	if (new_sock_cli == -1) {
		perror("accept");
		continue;
	}

	InsertarNuevoNodoProceso (&new_sock_cli, &new_p);

		}
	return 0;

}

void* planificar_sstf(void* arg){


	params_sstf parametros;

	parametros = (struct params_sstf*)arg;

	td_lista* pedidos_procesados;


	td_pedido_disco* nodo_entrante = NULL;
	uint8_t err = 0;

	while(1){

		//<HACER> ACA VA UN WAIT DE MUTEX

		//sino hay nodos entrantes para procesar espera
		if (cola_vacia(parametros.pedidos_entrantes) == COLA_VACIA) sleep(1);

		//saca un nodo de la cola entrante
		err = sacar_nodo(parametros.pedidos_entrantes,nodo_entrante);
		if (err != 0) return -1; //ERROR AL DESENCOLAR PEDIDO

		if (hay_que_encolar(nodo_entrante->posicion,sentido))

		adelantar_pista(parametros.disco);
		if (llego_tope(parametros.disco) == TOPE) sentido = BAJANDO;

		//<HACER> ACA VA UN SIGNAL DE MUTEX
	}

	return 0;
}
